/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKAjusteInventario;
import pe.com.cotelasa.scp.controlador.backingBean.BKArticuloKardex;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioMotivo;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.ArticuloSedePK;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.KardexPK;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBAjusteInventario")
@Scope("request")
public class MBAjusteInventario extends MBGenerico {

    @Inject
    private BKAjusteInventario bk;
    @Inject
    private IServicioArticuloSede servicioStock;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioMotivo servicioMotivo;
    @Inject
    private IServicioKardex servicioKardex;
    @Inject
    private IServicioEmpresa servicioEmpresa;
    @Inject
    private IServicioSede servicioSede;
    @Autowired
    BKSession session;

    public void buscarArticuloInventario() {

        try {
            System.out.println("id sede: " + bk.getArtculoSedeBusqueda().getId().getIdSede());
            System.out.println("id articulo: " + bk.getArtculoSedeBusqueda().getId().getIdArticulo());
            System.out.println("id partida: " + bk.getArtculoSedeBusqueda().getId().getPartidaLote());
            bk.getArtculoSedeBusqueda().getId();

            Sede sede = new Sede();
            sede.setIdEmpresa(session.getEmpresa());
            Collection<Sede> sedes = servicioSede.listaSedeAlmacenPorOrganizacion(sede);

            Integer[] listaIdSede = new Integer[sedes.size()];
            if (bk.getArtculoSedeBusqueda().getId().getIdSede() == 0) {
                int i = 0;
                for (Sede sedeB : sedes) {
                    listaIdSede[i] = sedeB.getId();
                    i++;
                }
            }

            bk.setListaArticuloSede(servicioStock.listaArticulosParaAjuste(bk.getArtculoSedeBusqueda(), listaIdSede));
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public String mostrarMantenimiento() {
        bk.setListaArticuloSede(null);
        bk.setArtculoSedeBusqueda(new ArticuloSede());
        bk.getArtculoSedeBusqueda().setId(new ArticuloSedePK());
        bk.getArtculoSedeBusqueda().getId().setIdArticulo(0);
        bk.getArtculoSedeBusqueda().getId().setIdSede(0);
        bk.getArtculoSedeBusqueda().getId().setIdEmpresa(session.getEmpresa().getId());
        bk.getArtculoSedeBusqueda().getId().setPartidaLote("");
        bk.setArtculoAjuste(new ArticuloSede());

        bk.setListaSede(new ArrayList<Sede>());
        for (Sede sede : session.getEmpresa().getSedeCollection()) {
            if (sede.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && sede.getEsAlmacen() == 1) {
                bk.getListaSede().add(sede);
            }
        }

        return URLPaginacion.AjusteInventario.URL_LISTA_AJUSTE_INVENTARIO;
    }

    public void buscarArticulos() {
        try {
            bk.setListaArticulo(new ArrayList<Articulo>());
            bk.getArtculoSedeBusqueda().getId().setIdArticulo(0);
            bk.getArtculoSedeBusqueda().getId().setPartidaLote("");
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), bk.getArtculoSedeBusqueda().getId().getIdSede(), 0, null));

            articuloSede.setArticulo(new Articulo());
            articuloSede.getArticulo().setIdCategoriaArticulo(null);

            for (Object i : servicioStock.listaArticulosUnicosPorSede(articuloSede)) {
                bk.getListaArticulo().add(servicioArticulo.conseguirArticuloPorId((Integer) i));
            }

        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void buscarPartidas() {
        bk.setListaPartida(new ArrayList<String>());
        bk.getArtculoSedeBusqueda().getId().setPartidaLote("");
        try {
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK());
            articuloSede.getId().setIdSede(bk.getArtculoSedeBusqueda().getId().getIdSede());
            articuloSede.getId().setIdArticulo(bk.getArtculoSedeBusqueda().getId().getIdArticulo());
            for (ArticuloSede articulo : servicioStock.listaPartidaPorSedeYArticulo(articuloSede)) {
                bk.getListaPartida().add(articulo.getPartidaLote());
            }

        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void inicializarAjuste(ActionEvent actionEvent) {
        try {
            bk.setListaMotivos(servicioMotivo.buscarMotivosPorGrupo("AJUSTE"));
            System.out.println("articulo sede: " + bk.getArtculoAjuste());
            bk.setArtculoAjuste(servicioStock.buscarArticuloSede((ArticuloSede) actionEvent.getComponent().getAttributes().get("articuloSese")));
            System.out.println("um: " + bk.getArtculoAjuste().getUnidadMedida().getAbrev());
            bk.setKardexAjuste(new Kardex());
            //bk.getKardexAjuste().setCaStockIncial(bk.getArtculoAjuste().getCaStockDisponible());
            //bk.getKardexAjuste().set
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void aplicarAjuste() {
        try {
            Kardex kardexB = new Kardex();
            kardexB.setId(new KardexPK());
            kardexB.getId().setIdEmpresa(bk.getArtculoAjuste().getId().getIdEmpresa());
            kardexB.getId().setIdArticulo(bk.getArtculoAjuste().getId().getIdArticulo());
            kardexB.getId().setIdSede(bk.getArtculoAjuste().getId().getIdSede());
            kardexB.getId().setPartidaLote(bk.getArtculoAjuste().getId().getPartidaLote());
            int numSec = 1;
            kardexB = servicioKardex.buscarUltimoKardex(kardexB);
            if (kardexB != null) {
                numSec = kardexB.getId().getNuSecKardex() + 1;
            }
            bk.getKardexAjuste().setId(new KardexPK(bk.getArtculoAjuste().getId().getIdEmpresa(),
                    bk.getArtculoAjuste().getId().getIdSede(),
                    bk.getArtculoAjuste().getId().getIdArticulo(),
                    numSec,
                    bk.getArtculoAjuste().getId().getPartidaLote()));

            bk.getKardexAjuste().setUsrCreacion(session.getUsuario().getUsuario());
            bk.getKardexAjuste().setFecCreacion(new Timestamp(new Date().getTime()));
            bk.getKardexAjuste().setCaStockIncial(bk.getArtculoAjuste().getCaStockDisponible());
            bk.getKardexAjuste().setCaMovimiento(bk.getKardexAjuste().getCaStockFinal().subtract(bk.getKardexAjuste().getCaStockIncial()));
            bk.getKardexAjuste().setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
            bk.getKardexAjuste().setFecMovimiento(new Date());
            bk.getKardexAjuste().setMotivo1(servicioMotivo.buscarMotivoPorDes(bk.getKardexAjuste().getDeMotivoAjuste()));
            bk.getKardexAjuste().setNuDocumento("");
            if (bk.getKardexAjuste().getCaMovimiento().doubleValue() > 0) {
                bk.getKardexAjuste().setTiMovimiento(Constantes.TipoMovimiento.ENTRADA);
            } else if (bk.getKardexAjuste().getCaMovimiento().doubleValue() < 0) {
                bk.getKardexAjuste().setTiMovimiento(Constantes.TipoMovimiento.SALIDA);
            }
            bk.getKardexAjuste().setUnidadMedida(bk.getArtculoAjuste().getUnidadMedida());
            BigDecimal valorPromedio = bk.getKardexAjuste().getCaMovimiento().multiply(bk.getKardexAjuste().getVaCostoArticulo());
            if (valorPromedio.floatValue() < 0) {
                valorPromedio = valorPromedio.negate();
            }
            bk.getKardexAjuste().setVaCostoPromedio(valorPromedio);
            bk.getKardexAjuste().setVaTotalInventario(bk.getKardexAjuste().getCaStockFinal().multiply(bk.getKardexAjuste().getVaCostoArticulo()));
            //bk.getKardexAjuste().set
            servicioKardex.guardarKardex(bk.getKardexAjuste());


            bk.getArtculoAjuste().setCaStockDisponible(bk.getKardexAjuste().getCaStockFinal());
            bk.getArtculoAjuste().setFecModificacion(new Timestamp(new Date().getTime()));
            bk.getArtculoAjuste().setUsrModificacion(session.getUsuario().getUsuario());
            bk.getArtculoAjuste().setVaCosto(bk.getKardexAjuste().getVaCostoArticulo());

            servicioStock.actualizarArticuloSede(bk.getArtculoAjuste());

            buscarArticuloInventario();

            mostrarMensaje("Se aplicó el ajuste Satisfactoriamente");
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }
}
